package com.mofum.msdom.excel.template.writer;

import com.mofum.msdom.excel.constant.ItemType;
import com.mofum.msdom.excel.constant.SheetItemType;
import com.mofum.msdom.excel.template.metadata.MPExcelTemplate;
import com.mofum.msdom.excel.template.metadata.MPSheetTemplateItem;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.util.Map;

/**
 * Excel模板写入器
 * -----------------------------------------------------------------
 * 1、设置模板
 * 2、根据模板生成新的模板的拷贝。
 * 3、获取模板中和Excel的行列对应关系。
 * 4、根据行列关系替换拷贝模板中的模板项值。
 * -----------------------------------------------------------------
 *
 * @author yuyang@qxy37.com
 * @since 2019/1/24 0024 10:17
 */
public interface IExcelTemplateWriter<Writer extends IExcelTemplateWriter> {

    /**
     * 开始写入
     *
     * @param outputStream 输出流
     * @return
     */
    Writer start(OutputStream outputStream);

    /**
     * 结束写入
     *
     * @return
     */
    Writer end();

    /**
     * 打开一个新文档流
     *
     * @return
     */
    Writer open();

    /**
     * 释放当前文档流
     *
     * @return
     */
    Writer release();

    /**
     * 设置当前文档的缓存刷新条数
     *
     * @param i 缓存刷新条数
     * @return
     */
    Writer cache(int i);

    /**
     * 添加SheetType
     *
     * @param name       模板项名称
     * @param sheetIndex 模板索引号
     * @param type       类型
     * @return
     */
    Writer addSheetType(String name, int sheetIndex, Type type);


    /**
     * 添加SheetType
     *
     * @param name          模板项名称
     * @param sheetItemType 模板项类型
     * @return
     */
    Writer addSheetType(String name, SheetItemType sheetItemType);

    /**
     * 添加SheetType
     *
     * @param sheetTypeMap 模板项类型Map
     * @return
     */
    Writer addSheetTypes(Map<String, SheetItemType> sheetTypeMap);

    /**
     * 添加工作薄选项
     *
     * @param mpSheetTemplateItem 选项
     * @return
     */
    Writer addSheetItems(MPSheetTemplateItem... mpSheetTemplateItem);

    /**
     * 添加工作薄选项
     *
     * @param name     名称
     * @param rowIndex 行
     * @param colIndex 列
     * @return
     */
    Writer addSheetItem(String name, int rowIndex, int colIndex);

    /**
     * 添加工作薄选项
     *
     * @param name         名称
     * @param rowIndex     行索引
     * @param colIndex     列索引
     * @param type         类型
     * @param selectedType 选择类型
     * @return
     */
    Writer addSheetItem(String name, int rowIndex, int colIndex, String type, String selectedType);

    /**
     * 写入模板数据
     *
     * @param templateData 模板数据
     * @return
     */
    Writer write(Map<String, Object> templateData);

    /**
     * 装载当前模板
     *
     * @param template 模板
     * @return
     */
    Writer template(MPExcelTemplate template);

    /**
     * 装载当前模板
     *
     * @param template 模板
     * @return
     */
    Writer template(File template);

    /**
     * 装载当前模板
     *
     * @param template 模板
     * @return
     */
    Writer template(InputStream template);

    /**
     * 装载当前模板
     *
     * @param template 模板
     * @return
     */
    Writer template(String template);

    /**
     * 装载当前模板
     *
     * @param template 模板
     * @return
     */
    Writer template(Workbook template);

}
